home *** CD-ROM | disk | FTP | other *** search
/ SPACE 1 / SPACE - Library 1 - Volume 1.iso / utilitys / 105 / source / _x6502.c next >
Encoding:
C/C++ Source or Header  |  1987-11-09  |  49.1 KB  |  2,149 lines

  1.  
  2. /***************************************************************************
  3.  
  4.    _X6502.C by Darek Mihocka (CIS: 73657,2714  GEnie: DAREKM)
  5.  
  6.    6502 simulation code is in this file
  7.  
  8.    June 5, 1987  14:40
  9.  
  10.  ***************************************************************************/
  11.  
  12. #include <stdio.h>
  13. #include <osbind.h>
  14. #include "_xformer.h"
  15.  
  16. /* format of mnemonics: 3 ascii codes of the opcode and the addressing mode:
  17.    00 - implied     01 - immediate     02 - zero page         03 - zero page,x
  18.    04 - zero page,y 05 - (zero page,x) 06 - (zero page),y
  19.    07 - absolute    08 - absolute,x    09 - absolute,y        0A - accumulator
  20.    0B - relative    0C - indirect      0D - absolute indirect
  21.  
  22.    used by the 6502 monitor for disassembling code
  23.  
  24.    I found out too late that Megamax supports long character constants. arghh!
  25. */
  26.  
  27. long mnemonics[256] = {
  28.  0x42524B00L, 0x4F524105L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x4F524102L,
  29.  0x41534C02L, 0x3F3F3F00L, 0x50485000L, 0x4F524101L, 0x41534C0AL, 0x3F3F3F00L,
  30.  0x3F3F3F00L, 0x4F524107L, 0x41534C07L, 0x3F3F3F00L, 0x42504C0BL, 0x4F524106L,
  31.  0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x4F524103L, 0x41534C03L, 0x3F3F3F00L,
  32.  0x434C4300L, 0x4F524109L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x4F524108L,
  33.  0x41534C08L, 0x3F3F3F00L, 0x4A535207L, 0x414E4405L, 0x3F3F3F00L, 0x3F3F3F00L,
  34.  0x42495402L, 0x414E4402L, 0x524F4C02L, 0x3F3F3F00L, 0x504C5000L, 0x414E4401L,
  35.  0x524F4C0AL, 0x3F3F3F00L, 0x42495407L, 0x414E4407L, 0x524F4C07L, 0x3F3F3F00L,
  36.  0x424D490BL, 0x414E4406L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x414E4403L,
  37.  0x524F4C03L, 0x3F3F3F00L, 0x53454300L, 0x414E4409L, 0x3F3F3F00L, 0x3F3F3F00L,
  38.  0x3F3F3F00L, 0x414E4408L, 0x524F4C08L, 0x3F3F3F00L, 0x52544900L, 0x454F5205L,
  39.  0x4C53520AL, 0x3F3F3F00L, 0x4A4D5007L, 0x454F5202L, 0x4C535202L, 0x3F3F3F00L,
  40.  0x50484100L, 0x454F5201L, 0x4C53520AL, 0x3F3F3F00L, 0x4A4D5007L, 0x454F5207L,
  41.  0x4C535207L, 0x3F3F3F00L, 0x4256430BL, 0x454F5206L, 0x3F3F3F00L, 0x3F3F3F00L,
  42.  0x3F3F3F00L, 0x454F5203L, 0x4C535203L, 0x3F3F3F00L, 0x434C4900L, 0x454F5209L,
  43.  0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x454F5208L, 0x4C535208L, 0x3F3F3F00L,
  44.  0x52545300L, 0x41444305L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x41444302L,
  45.  0x524F5202L, 0x3F3F3F00L, 0x504C4100L, 0x41444301L, 0x524F520AL, 0x3F3F3F00L,
  46.  0x4A4D500CL, 0x41444307L, 0x524F5207L, 0x3F3F3F00L, 0x4256530BL, 0x41444306L,
  47.  0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x41444303L, 0x524F5203L, 0x3F3F3F00L,
  48.  0x53454900L, 0x41444309L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x41444308L,
  49.  0x524F5208L, 0x3F3F3F00L, 0X3F3F3F00L, 0X53544105L, 0X3F3F3F00L, 0X3F3F3F00L,
  50.  0X53545902L, 0X53544102L, 0X53545802L, 0X3F3F3F00L, 0X44455900L, 0X3F3F3F00L,
  51.  0X54584100L, 0X3F3F3F00L, 0X53545907L, 0X53544107L, 0X53545807L, 0X3F3F3F00L,
  52.  0X4243430BL, 0X53544106L, 0X3F3F3F00L, 0X3F3F3F00L, 0X53545903L, 0X53544103L,
  53.  0X53545804L, 0X3F3F3F00L, 0X54594100L, 0X53544109L, 0X54585300L, 0X3F3F3F00L,
  54.  0X3F3F3F00L, 0X53544108L, 0X3F3F3F00L, 0X3F3F3F00L, 0X4C445901L, 0X4C444105L,
  55.  0X4C445801L, 0X3F3F3F00L, 0X4C445902L, 0X4C444102L, 0X4C445802L, 0X3F3F3F00L,
  56.  0X54415900L, 0X4C444101L, 0X54415800L, 0X3F3F3F00L, 0X4C445907L, 0X4C444107L,
  57.  0X4C445807L, 0X3F3F3F00L, 0X4243530BL, 0X4C444106L, 0X3F3F3F00L, 0X3F3F3F00L,
  58.  0X4C445903L, 0X4C444103L, 0X4C445804L, 0X3F3F3F00L, 0X434C5600L, 0X4C444109L,
  59.  0X54535800L, 0X3F3F3F00L, 0X4C445908L, 0X4C444108L, 0X4C445809L, 0X3F3F3F00L,
  60.  0X43505901L, 0X434D5005L, 0X3F3F3F00L, 0X3F3F3F00L, 0X43505902L, 0X434d5002L,
  61.  0X44454302L, 0X3F3F3F00L, 0X494E5900L, 0X434D5001L, 0X44455800L, 0X3F3F3F00L,
  62.  0X43505907L, 0X434D5007L, 0X44454307L, 0X3F3F3F00L, 0X424E450BL, 0X434D5006L,
  63.  0X3F3F3F00L, 0X3F3F3F00L, 0X3F3F3F00L, 0X434D5003L, 0X44454303L, 0X3F3F3F00L,
  64.  0X434C4400L, 0X434D5009L, 0X3F3F3F00L, 0X3F3F3F00L, 0X3F3F3F00L, 0X434D5008L,
  65.  0X44454308L, 0X3F3F3F00L, 0X43505801L, 0X53424305L, 0X3F3F3F00L, 0X3F3F3F00L,
  66.  0X43505802L, 0X53424302L, 0X494E4302L, 0X3F3F3F00L, 0X494E5800L, 0X53424301L,
  67.  0X4E4F5000L, 0X3F3F3F00L, 0X43505807L, 0X53424307L, 0X494E4307L, 0X3F3F3F00L,
  68.  0X4245510BL, 0X53424306L, 0X3F3F3F00L, 0X3F3F3F00L, 0X3F3F3F00L, 0X53424303L,
  69.  0X494E4303L, 0X3F3F3F00L, 0X53454400L, 0X53424309L, 0X3F3F3F00L, 0X3F3F3F00L,
  70.  0X3F3F3F00L, 0X53424308L, 0X494E4308L, 0X3F3F3F00L
  71.  } ;
  72.  
  73. int (*vec_6502[256])() = {  /* create an array of pointers to 256 functions */
  74.  
  75.  op00, op01, op02, op03, op04, op05, op06, op07, op08,
  76.  op09, op0A, op0B, op0C, op0D, op0E, op0F, op10, op11, op12,
  77.  op13, op14, op15, op16, op17, op18, op19, op1A, op1B,
  78.  op1C, op1D, op1E, op1F, op20, op21, op22, op23, op24,
  79.  op25, op26, op27, op28, op29, op2A, op2B, op2C, op2D,
  80.  op2E, op2F, op30, op31, op32, op33, op34, op35, op36,
  81.  op37, op38, op39, op3A, op3B, op3C, op3D, op3E, op3F,
  82.  op40, op41, op42, op43, op44, op45, op46, op47, op48,
  83.  op49, op4A, op4B, op4C, op4D, op4E, op4F, op50, op51,
  84.  op52, op53, op54, op55, op56, op57, op58, op59, op5A,
  85.  op5B, op5C, op5D, op5E, op5F, op60, op61, op62, op63,
  86.  op64, op65, op66, op67, op68, op69, op6A, op6B, op6C,
  87.  op6D, op6E, op6F, op70, op71, op72, op73, op74, op75,
  88.  op76, op77, op78, op79, op7A, op7B, op7C, op7D, op7E,
  89.  op7F, op80, op81, op82, op83, op84, op85, op86, op87,
  90.  op88, op89, op8A, op8B, op8C, op8D, op8E, op8F, op90,
  91.  op91, op92, op93, op94, op95, op96, op97, op98, op99,
  92.  op9A, op9B, op9C, op9D, op9E, op9F, opA0, opA1, opA2,
  93.  opA3, opA4, opA5, opA6, opA7, opA8, opA9, opAA, opAB,
  94.  opAC, opAD, opAE, opAF, opB0, opB1, opB2, opB3, opB4,
  95.  opB5, opB6, opB7, opB8, opB9, opBA, opBB, opBC, opBD,
  96.  opBE, opBF, opC0, opC1, opC2, opC3, opC4, opC5, opC6,
  97.  opC7, opC8, opC9, opCA, opCB, opCC, opCD, opCE, opCF,
  98.  opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7, opD8,
  99.  opD9, opDA, opDB, opDC, opDD, opDE, opDF, opE0, opE1,
  100.  opE2, opE3, opE4, opE5, opE6, opE7, opE8, opE9, opEA,
  101.  opEB, opEC, opED, opEE, opEF, opF0, opF1, opF2, opF3,
  102.  opF4, opF5, opF6, opF7, opF8, opF9, opFA, opFB, opFC,
  103.  opFD, opFE, opFF } ;
  104.  
  105.  
  106. int (*dec_6502[256])() = {  /* an array of pointers assuming D flag is on */
  107.  
  108.  op00, op01, op02, op03, op04, op05, op06, op07, op08,
  109.  op09, op0A, op0B, op0C, op0D, op0E, op0F, op10, op11, op12,
  110.  op13, op14, op15, op16, op17, op18, op19, op1A, op1B,
  111.  op1C, op1D, op1E, op1F, op20, op21, op22, op23, op24,
  112.  op25, op26, op27, op28, op29, op2A, op2B, op2C, op2D,
  113.  op2E, op2F, op30, op31, op32, op33, op34, op35, op36,
  114.  op37, op38, op39, op3A, op3B, op3C, op3D, op3E, op3F,
  115.  op40, op41, op42, op43, op44, op45, op46, op47, op48,
  116.  op49, op4A, op4B, op4C, op4D, op4E, op4F, op50, op51,
  117.  op52, op53, op54, op55, op56, op57, op58, op59, op5A,
  118.  op5B, op5C, op5D, op5E, op5F, op60, op61dec, op62, op63,
  119.  op64, op65dec, op66, op67, op68, op69dec, op6A, op6B, op6C,
  120.  op6Ddec, op6E, op6F, op70, op71dec, op72, op73, op74, op75dec,
  121.  op76, op77, op78, op79dec, op7A, op7B, op7C, op7Ddec, op7E,
  122.  op7F, op80, op81, op82, op83, op84, op85, op86, op87,
  123.  op88, op89, op8A, op8B, op8C, op8D, op8E, op8F, op90,
  124.  op91, op92, op93, op94, op95, op96, op97, op98, op99,
  125.  op9A, op9B, op9C, op9D, op9E, op9F, opA0, opA1, opA2,
  126.  opA3, opA4, opA5, opA6, opA7, opA8, opA9, opAA, opAB,
  127.  opAC, opAD, opAE, opAF, opB0, opB1, opB2, opB3, opB4,
  128.  opB5, opB6, opB7, opB8, opB9, opBA, opBB, opBC, opBD,
  129.  opBE, opBF, opC0, opC1, opC2, opC3, opC4, opC5, opC6,
  130.  opC7, opC8, opC9, opCA, opCB, opCC, opCD, opCE, opCF,
  131.  opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7, opD8,
  132.  opD9, opDA, opDB, opDC, opDD, opDE, opDF, opE0, opE1dec,
  133.  opE2, opE3, opE4, opE5dec, opE6, opE7, opE8, opE9dec, opEA,
  134.  opEB, opEC, opEDdec, opEE, opEF, opF0, opF1dec, opF2, opF3,
  135.  opF4, opF5dec, opF6, opF7, opF8, opF9dec, opFA, opFB, opFC,
  136.  opFDdec, opFE, opFF } ;
  137.  
  138.  
  139. /* No more C code in this file, but we have to declare an entry point */
  140.  
  141. execute() {
  142.  
  143.   asm {
  144.     movem.l D0-D7/A0-A3,-(SP)   ; save enviornment
  145.  
  146.  ; clear everything just to be safe
  147.     clr.l   D0
  148.     clr.l   D1
  149.     clr.l   D2
  150.     clr.l   D3
  151.     clr.l   D4
  152.     clr.l   D5
  153.     clr.l   D6
  154.     clr.l   D7
  155.  
  156.  ; convert   P register NV_BDIZC to CCR register BDIXNZVC
  157.     move.b  p(GLOBAL),REGST
  158.     move.b  REGST,DBUS          ; BDI
  159.     move.b  REGST,REGA          ; N
  160.     move.b  REGST,REGX          ; V
  161.     move.b  REGST,REGY          ; Z
  162.     move.b  REGST,REGEA         ; set X equal to C
  163.  
  164.     asl.b   #3,DBUS
  165.     and.b   #0xE0,DBUS          ; BDI_____
  166.     asl.b   #4,REGEA
  167.     and.b   #BITX,REGEA         ; ___X____
  168.     asl.b   #1,REGY
  169.     and.b   #BITZ,REGY          ; _____Z__
  170.     asr.b   #4,REGA
  171.     and.b   #BITN,REGA          ; ____N___
  172.     asr.b   #5,REGX
  173.     and.b   #BITV,REGX          ; ______V_
  174.  
  175.     move.b  REGEA,REGST
  176.     or.b    REGX,REGST
  177.     or.b    REGY,REGST
  178.     or.b    REGA,REGST
  179.     or.b    DBUS,REGST          ; that gets BDIXNZVC !!!
  180.  
  181.     move.b  a(GLOBAL),REGA      ; load 6502 registers
  182.     move.b  x(GLOBAL),REGX
  183.     move.b  y(GLOBAL),REGY
  184.     move.w  #0x100,REGSP
  185.     move.b  sp(GLOBAL),REGSP    ; stack is on page 1
  186.     move.w  pc(GLOBAL),REGPC
  187.  
  188.     lea     emul(PC),REGOPS     ; pointer to emulator
  189.     tst.b   fTrace(GLOBAL)
  190.     beq.s   notrace             ; if trace bit set...
  191.     lea     exit_emul(PC),REGOPS    ; divert to exit routine
  192.   notrace:
  193.     lea     pemul(PC),REGMEA
  194.     move.l  REGOPS,(REGMEA)
  195.  
  196.     lea     vec_6502(GLOBAL),REGOPS ; pointer to table
  197.     btst.b   #6,REGST               ; check decimal flag
  198.     beq.s   nodec
  199.     lea     dec_6502(GLOBAL),REGOPS ; pointer to table
  200.   nodec:
  201.     move.l  mem(GLOBAL),REGMEA  ; pointer to mem[ea]
  202.     move.l  stat(GLOBAL),REGSTAT
  203.     move.l  REGMEA,REGEA
  204.     add.l   REGMEA,REGPC        ; pointer to mem[pc]
  205.     move.l  REGPC,REGMPC
  206.  
  207.  ; fall through into dispatch routine
  208.  
  209.   emul:
  210.     clr.w   IR                      ; clear "instruction register"
  211.     move.b  (REGMPC)+,IR            ; fetch an opcode
  212.     add.w   IR,IR
  213.     add.w   IR,IR                   ; multiply by 4
  214.     move.l  0(REGOPS,IR.w),REGMEA   ; calculate address of opcode handler
  215.     jmp     (REGMEA)                ; and jump to it
  216.  
  217.   pemul:
  218.     dc.l    0                       ; pointer to emul, exit_emul, or sysvbl
  219.  
  220.   exit_emul:
  221.     move.b  REGA,a(GLOBAL)          ; save 6502 registers
  222.     move.b  REGX,x(GLOBAL)
  223.     move.b  REGY,y(GLOBAL)
  224.     move.b  REGSP,sp(GLOBAL)
  225.     move.w  REGMPC,pc(GLOBAL)
  226.     move.w  REGMEA,ea(GLOBAL)
  227.  
  228.  ; convert CCR register BDIXNZVC to  P  register NV_BDIZC
  229.     move.b  REGST,DBUS          ; BDI
  230.     move.b  REGST,REGA          ; N
  231.     move.b  REGST,REGX          ; V
  232.     move.b  REGST,REGY          ; Z
  233.     move.b  REGST,REGEA         ; C
  234.  
  235.     asr.b   #3,DBUS
  236.     and.b   #0x1C,DBUS          ; ___BDI__
  237.     asr.b   #4,REGEA
  238.     and.b   #CBIT,REGEA         ; _______C
  239.     asr.b   #1,REGY
  240.     and.b   #ZBIT,REGY          ; ______Z_
  241.     asl.b   #4,REGA
  242.     and.b   #NBIT,REGA          ; N_______
  243.     asl.b   #5,REGX
  244.     and.b   #VBIT,REGX          ; _V______
  245.  
  246.     move.b  REGEA,REGST
  247.     or.b    REGX,REGST
  248.     or.b    REGY,REGST
  249.     or.b    REGA,REGST
  250.     or.b    DBUS,REGST          ; that gets NV_BDIZC
  251.     ori.b   #0x20,REGST         ; and then  NV1BDIZC
  252.  
  253.     move.b  REGST,p(GLOBAL)
  254.  
  255.     movem.l (SP)+,D0-D7/A0-A3   ; restore enviornment
  256.  
  257. ; and get outta here!
  258.   }
  259.  
  260.     return ;
  261.  
  262.   asm {
  263.  
  264.  ; Some common code to save space
  265.  
  266.  ; at entry, all common routines MUST have REGEA loaded!!
  267.  
  268.  ; this does an ORA with REGA and set the flags in REGST
  269.  ; first check if the status byte is negative, if so, call emul_serv
  270.   doORchk:
  271.     move.b  0(REGSTAT,REGEA.w),IR   ; get status byte
  272.     bpl.s   doOR                ; if OK to read memory go do so
  273.     SETREAD                     ; else set read flag
  274.     BSR     emul_serv           ; and call service routine
  275.   doOR:
  276.     move.l  REGEA,REGMEA        ; get the byte
  277.     or.b    (REGMEA),REGA       ; ORA with accumualtor
  278.     move.w  SR,DBUS             ; get CCR register
  279.     and.b   #(BITN|BITZ),DBUS   ; isolate N and Z flags
  280.     and.b   #~(BITN|BITZ),REGST ; clear them out in P register
  281.     or.b    DBUS,REGST          ; join them
  282.     DISPATCH                    ; and go do another opcode
  283.  
  284.  ; similar to doOR except it does an AND
  285.   doANDchk:
  286.     move.b  0(REGSTAT,REGEA.w),IR
  287.     bpl.s   doAND
  288.     SETREAD
  289.     BSR     emul_serv
  290.   doAND:
  291.     move.l  REGEA,REGMEA
  292.     and.b   (REGMEA),REGA
  293.     move.w  SR,DBUS
  294.     and.b   #(BITN|BITZ),DBUS
  295.     and.b   #~(BITN|BITZ),REGST
  296.     or.b    DBUS,REGST
  297.     DISPATCH
  298.  
  299.   doEORchk:
  300.     move.b  0(REGSTAT,REGEA.w),IR
  301.     bpl.s   doEOR
  302.     SETREAD
  303.     BSR     emul_serv
  304.   doEOR:
  305.     move.l  REGEA,REGMEA
  306.     move.b  (REGMEA),DBUS       ; silly 68000 limitation
  307.     eor.b   DBUS,REGA           ; makes you do it in 2 steps
  308.     move.w  SR,DBUS
  309.     and.b   #(BITN|BITZ),DBUS
  310.     and.b   #~(BITN|BITZ),REGST
  311.     or.b    DBUS,REGST
  312.     DISPATCH
  313.  
  314.  ; increment memory location REGEA
  315.   doINCchk:
  316.     move.b  0(REGSTAT,REGEA.w),IR
  317.     bpl.s   doINC
  318.     SETREAD
  319.     BSR     emul_serv
  320.   doINC:
  321.     move.l  REGEA,REGMEA
  322.     addq.b  #1,(REGMEA)
  323.     move.w  SR,DBUS
  324.     and.b   #(BITN|BITZ),DBUS
  325.     and.b   #~(BITN|BITZ),REGST
  326.     or.b    DBUS,REGST
  327.     DISPATCH
  328.  
  329.  ; decrement memory location REGEA
  330.   doDECchk:
  331.     move.b  0(REGSTAT,REGEA.w),IR
  332.     bpl.s   doDEC
  333.     SETREAD
  334.     BSR     emul_serv
  335.   doDEC:
  336.     move.l  REGEA,REGMEA
  337.     subq.b  #1,(REGMEA)
  338.     move.w  SR,DBUS
  339.     and.b   #(BITN|BITZ),DBUS
  340.     and.b   #~(BITN|BITZ),REGST
  341.     or.b    DBUS,REGST
  342.     DISPATCH
  343.  
  344.  ; do a LDA, but first check to see if the status byte is positive
  345.   doLDAchk:
  346.     move.b  0(REGSTAT,REGEA.w),IR
  347.     bpl.s   doLDA
  348.     SETREAD
  349.     bsr     emul_serv
  350.  ; at this point the service routine executed, or the status byte was zero
  351.   doLDA:
  352.     move.l  REGEA,REGMEA
  353.     move.b  (REGMEA),REGA
  354.     move.w  SR,DBUS
  355.     and.b   #(BITN|BITZ),DBUS
  356.     and.b   #~(BITN|BITZ),REGST
  357.     or.b    DBUS,REGST
  358.     DISPATCH
  359.  
  360.   doLDXchk:
  361.     move.b  0(REGSTAT,REGEA.w),IR
  362.     bpl.s   doLDX
  363.     SETREAD
  364.     BSR     emul_serv
  365.   doLDX:
  366.     move.l  REGEA,REGMEA
  367.     move.b  (REGMEA),REGX
  368.     move.w  SR,DBUS
  369.     and.b   #(BITN|BITZ),DBUS
  370.     and.b   #~(BITN|BITZ),REGST
  371.     or.b    DBUS,REGST
  372.     DISPATCH
  373.  
  374.   doLDYchk:
  375.     move.b  0(REGSTAT,REGEA.w),IR
  376.     bpl.s   doLDY
  377.     SETREAD
  378.     BSR     emul_serv
  379.   doLDY:
  380.     move.l  REGEA,REGMEA
  381.     move.b  (REGMEA),REGY
  382.     move.w  SR,DBUS
  383.     and.b   #(BITN|BITZ),DBUS
  384.     and.b   #~(BITN|BITZ),REGST
  385.     or.b    DBUS,REGST
  386.     DISPATCH
  387.  
  388.  ; do a STA, but first check to see if the status byte is non-zero
  389.   doSTAchk:
  390.     move.b  0(REGSTAT,REGEA.w),IR
  391.     beq.s   doSTA
  392.     SETWRITE
  393.     SWAP    DBUS                ; save status byte in lo word of D0
  394.     move.b  REGA,DBUS           ; put the byte to store in the hi word
  395.     SWAP    DBUS
  396.     bra     emul_serv           ; call emul serv
  397.   doSTA:
  398.     move.l  REGEA,REGMEA        ; most routines will do this themselves
  399.     move.b  REGA,(REGMEA)       ; but just in case, do the write to memory
  400.     DISPATCH
  401.  
  402.  ; ditto, but for STX
  403.   doSTXchk:
  404.     move.b  0(REGSTAT,REGEA.w),IR
  405.     beq.s   doSTX
  406.     SETWRITE
  407.     SWAP    DBUS
  408.     move.b  REGX,DBUS
  409.     SWAP    DBUS
  410.     bra     emul_serv
  411.   doSTX:
  412.     move.l  REGEA,REGMEA
  413.     move.b  REGX,(REGMEA)
  414.     DISPATCH
  415.  
  416.  ; ditto, but for STY
  417.   doSTYchk:
  418.     move.b  0(REGSTAT,REGEA.w),IR
  419.     beq.s   doSTY
  420.     SETWRITE
  421.     SWAP    DBUS
  422.     move.b  REGY,DBUS
  423.     SWAP    DBUS
  424.     bra     emul_serv
  425.   doSTY:
  426.     move.l  REGEA,REGMEA
  427.     move.b  REGY,(REGMEA)
  428.     DISPATCH
  429.  
  430.  ; do an ADC, similar to above
  431.   doADCchk:
  432.     move.b  0(REGSTAT,REGEA.w),IR
  433.     bpl.s   doADC
  434.     SETREAD
  435.     BSR     emul_serv
  436.   doADC:
  437.     move.l  REGEA,REGMEA
  438.     move.b  (REGMEA),DBUS
  439.     ori.b   #BITZ,REGST         ; ADDX doesn't set Z flag
  440.     move.b  REGST,CCR           ; also prepare C bit
  441.     addx.b  DBUS,REGA           ; binary add
  442.     move.w  SR,DBUS
  443.     and.b   #(BITN|BITZ|BITV|BITX),DBUS
  444.     and.b   #~(BITN|BITZ|BITV|BITX),REGST
  445.     or.b    DBUS,REGST
  446.     DISPATCH
  447.  
  448.   doADCdecchk:
  449.     move.b  0(REGSTAT,REGEA.w),IR
  450.     bpl.s   doADCdec
  451.     SETREAD
  452.     BSR     emul_serv
  453.   doADCdec:
  454.     move.l  REGEA,REGMEA
  455.     move.b  (REGMEA),DBUS
  456.     ori.b   #BITZ,REGST
  457.     move.b  REGST,CCR
  458.     ABCD    DBUS,REGA
  459.     move.w  SR,DBUS
  460.     and.b   #(BITN|BITZ|BITV|BITX),DBUS
  461.     and.b   #~(BITN|BITZ|BITV|BITX),REGST
  462.     or.b    DBUS,REGST
  463.     DISPATCH
  464.  
  465.   doSBCchk:
  466.     move.b  0(REGSTAT,REGEA.w),IR
  467.     bpl.s   doSBC
  468.     SETREAD
  469.     BSR     emul_serv
  470.   doSBC:
  471.     move.l  REGEA,REGMEA
  472.     move.b  (REGMEA),DBUS
  473.     eori.b  #BITX,REGST         ; different than 6502
  474.     ori.b   #BITZ,REGST         ; SUBX doesn't set Z flag
  475.     move.b  REGST,CCR
  476.     subx.b  DBUS,REGA
  477.     move.w  SR,DBUS
  478.     and.b   #(BITN|BITZ|BITX|BITV),DBUS
  479.     eori.b  #BITX,DBUS
  480.     and.b   #~(BITN|BITZ|BITX|BITV),REGST
  481.     or.b    DBUS,REGST
  482.     DISPATCH
  483.  
  484.   doSBCdecchk:
  485.     move.b  0(REGSTAT,REGEA.w),IR
  486.     bpl.s   doSBCdec
  487.     SETREAD
  488.     BSR     emul_serv
  489.   doSBCdec:
  490.     move.l  REGEA,REGMEA
  491.     move.b  (REGMEA),DBUS
  492.     eori.b  #BITX,REGST
  493.     ori.b   #BITZ,REGST
  494.     move.b  REGST,CCR
  495.     SBCD    DBUS,REGA
  496.     move.w  SR,DBUS
  497.     and.b   #(BITN|BITZ|BITX|BITV),DBUS
  498.     eori.b  #BITX,DBUS
  499.     and.b   #~(BITN|BITZ|BITX|BITV),REGST
  500.     or.b    DBUS,REGST
  501.     DISPATCH
  502.  
  503.  ; in CMP, DBUS already has the byte loaded
  504.   doCMP:
  505.     SWAP    DBUS
  506.     move.b  REGA,DBUS
  507.     SWAP    DBUS
  508.     SUB.b   DBUS,REGA
  509.     move.w  SR,DBUS
  510.     and.b   #(BITN|BITZ|BITX),DBUS
  511.     eori.b  #BITX,DBUS
  512.     and.b   #~(BITN|BITZ|BITX),REGST
  513.     or.b    DBUS,REGST
  514.     SWAP    DBUS
  515.     move.b  DBUS,REGA
  516.     SWAP    DBUS
  517.     DISPATCH
  518.  
  519.   doCPX:
  520.     SWAP    DBUS
  521.     move.b  REGX,DBUS
  522.     SWAP    DBUS
  523.     SUB.b   DBUS,REGX
  524.     move.w  SR,DBUS
  525.     and.b   #(BITN|BITZ|BITX),DBUS
  526.     eori.b  #BITX,DBUS
  527.     and.b   #~(BITN|BITZ|BITX),REGST
  528.     or.b    DBUS,REGST
  529.     SWAP    DBUS
  530.     move.b  DBUS,REGX
  531.     SWAP    DBUS
  532.     DISPATCH
  533.  
  534.   doCPY:
  535.     SWAP    DBUS
  536.     move.b  REGY,DBUS
  537.     SWAP    DBUS
  538.     SUB.b   DBUS,REGY
  539.     move.w  SR,DBUS
  540.     and.b   #(BITN|BITZ|BITX),DBUS
  541.     eori.b  #BITX,DBUS
  542.     and.b   #~(BITN|BITZ|BITX),REGST
  543.     or.b    DBUS,REGST
  544.     SWAP    DBUS
  545.     move.b  DBUS,REGY
  546.     SWAP    DBUS
  547.     DISPATCH
  548.  
  549.   doROLchk:
  550.     move.b  0(REGSTAT,REGEA.w),IR
  551.     bpl.s   doROL
  552.     SETREAD
  553.     BSR     emul_serv
  554.   doROL:
  555.     move.l  REGEA,REGMEA
  556.     move.b  (REGMEA),IR         ; get byte
  557.     move.b  REGST,CCR
  558.     ROXL.b  #1,IR               ; shift it
  559.     move.b  IR,(REGMEA)         ; save in memory
  560.     move.w  SR,DBUS
  561.     and.b   #(BITN|BITZ|BITX),DBUS
  562.     and.b   #~(BITN|BITZ|BITX),REGST
  563.     or.b    DBUS,REGST
  564.     DISPATCH
  565.  
  566.   doRORchk:
  567.     move.b  0(REGSTAT,REGEA.w),IR
  568.     bpl.s   doROR
  569.     SETREAD
  570.     BSR     emul_serv
  571.   doROR:
  572.     move.l  REGEA,REGMEA
  573.     move.b  (REGMEA),IR
  574.     move.b  REGST,CCR
  575.     ROXR.b  #1,IR
  576.     move.b  IR,(REGMEA)
  577.     move.w  SR,DBUS
  578.     and.b   #(BITN|BITZ|BITX),DBUS
  579.     and.b   #~(BITN|BITZ|BITX),REGST
  580.     or.b    DBUS,REGST
  581.     DISPATCH
  582.  
  583.   doASLchk:
  584.     move.b  0(REGSTAT,REGEA.w),IR
  585.     bpl.s   doASL
  586.     SETREAD
  587.     BSR     emul_serv
  588.   doASL:
  589.     move.l  REGEA,REGMEA
  590.     move.b  (REGMEA),IR
  591.     asl.b   #1,IR
  592.     move.b  IR,(REGMEA)
  593.     move.w  SR,DBUS
  594.     and.b   #(BITN|BITZ|BITX),DBUS
  595.     and.b   #~(BITN|BITZ|BITX),REGST
  596.     or.b    DBUS,REGST
  597.     DISPATCH
  598.  
  599.   doLSRchk:
  600.     move.b  0(REGSTAT,REGEA.w),IR
  601.     bpl.s   doLSR
  602.     SETREAD
  603.     BSR     emul_serv
  604.   doLSR:
  605.     move.l  REGEA,REGMEA
  606.     move.b  (REGMEA),IR
  607.     lsr.b   #1,IR
  608.     move.b  IR,(REGMEA)
  609.     move.w  SR,DBUS
  610.     and.b   #(BITN|BITZ|BITX),DBUS
  611.     and.b   #~(BITN|BITZ|BITX),REGST
  612.     or.b    DBUS,REGST
  613.     DISPATCH
  614.  
  615.   doBITchk:
  616.     move.b  0(REGSTAT,REGEA.w),IR
  617.     bpl.s   doBIT
  618.     SETREAD
  619.     BSR     emul_serv
  620.   doBIT:
  621.     tst.b   (REGMEA)            ; V bit not set by a tst
  622.     move.w  SR,DBUS
  623.     and.b   #(BITN),DBUS
  624.     and.b   #~(BITN|BITV|BITZ),REGST
  625.     or.b    DBUS,REGST
  626.     move.b  (REGMEA),DBUS       ; read the byte and...
  627.     lsr.b   #5,DBUS             ; shift V bit into position
  628.     and.b   #(BITV),DBUS
  629.     or.b    DBUS,REGST
  630.     move.b  (REGMEA),DBUS
  631.     and.b   REGA,DBUS
  632.     move.w  SR,DBUS
  633.     and.b   #(BITZ),DBUS        ; Z flag set if M AND A = 0
  634.     or.b    DBUS,REGST
  635.     DISPATCH
  636.  
  637.  ; 256 emulation routines go here
  638.  
  639.  ; BRK is not quite implemented since it should never really occur in real life
  640.   op00:
  641.     or.b    #BITB,REGST
  642.     bra     exit_emul
  643.  
  644.  ; ORA (zp,X)
  645.   op01:
  646.     clr.w   REGEA               ; clear IR
  647.     move.b  (REGMPC)+,REGEA     ; get zero page address
  648.     add.b   REGX,REGEA          ; add X and wraparound to zero page
  649.     move.l  REGEA,REGMEA        ; effective address calculated
  650.     move.b  1(REGMEA),-(SP)     ; get hi byte
  651.     move.w  (SP)+,REGEA         ; and shift by 8 (faster than a lsl.w #8)
  652.     move.b  (REGMEA),REGEA      ; get lo byte
  653.     bra     doORchk             ; go to common ORing routine
  654.  
  655.  ; ORA zp
  656.   op05:
  657.     clr.w   REGEA
  658.     move.b  (REGMPC)+,REGEA
  659.     bra     doOR
  660.  
  661.  ; ASL zp
  662.   op06:
  663.     clr.w   REGEA
  664.     move.b  (REGMPC)+,REGEA
  665.     bra     doASL
  666.  
  667.  ; PHP - do a 68000 to 6502 flag conversion, like in the init code
  668.   op08:
  669.     move.w  REGSP,REGEA
  670.     move.l  REGEA,REGMEA
  671.     movem.l DBUS/REGST/REGA/REGX/REGY/REGEA,-(SP)
  672.     move.b  REGST,DBUS
  673.     move.b  REGST,REGA
  674.     move.b  REGST,REGX
  675.     move.b  REGST,REGY
  676.     move.b  REGST,REGEA
  677.     asr.b   #3,DBUS
  678.     and.b   #0x1C,DBUS
  679.     asr.b   #4,REGEA
  680.     and.b   #CBIT,REGEA
  681.     asr.b   #1,REGY
  682.     and.b   #ZBIT,REGY
  683.     asl.b   #4,REGA
  684.     and.b   #NBIT,REGA
  685.     asl.b   #5,REGX
  686.     and.b   #VBIT,REGX
  687.     move.b  REGEA,REGST
  688.     or.b    REGX,REGST
  689.     or.b    REGY,REGST
  690.     or.b    REGA,REGST
  691.     or.b    DBUS,REGST
  692.     ori.b   #0x20,REGST
  693.     move.b  REGST,(REGMEA)
  694.     movem.l (SP)+,DBUS/REGST/REGA/REGX/REGY/REGEA
  695.     subq.b  #1,REGSP
  696.     DISPATCH
  697.  
  698.  ; ORA #
  699.   op09:
  700.     or.b    (REGMPC)+,REGA
  701.     move.w  SR,DBUS
  702.     and.b   #(BITN|BITZ),DBUS
  703.     and.b   #~(BITN|BITZ),REGST
  704.     or.b    DBUS,REGST
  705.     DISPATCH
  706.  
  707.  ; ASL A
  708.   op0A:
  709.     asl.b   #1,REGA
  710.     move.w  SR,DBUS
  711.     and.b   #(BITN|BITZ|BITX),DBUS
  712.     and.b   #~(BITN|BITZ|BITX),REGST
  713.     or.b    DBUS,REGST
  714.     DISPATCH
  715.  
  716.  ; ORA abs
  717.   op0D:
  718.     move.b  1(REGMPC),-(SP)     ; get hi byte
  719.     move.w  (SP)+,REGEA         ; shift it 8 times
  720.     move.b  (REGMPC),REGEA      ; get lo byte
  721.     addq.w  #2,REGMPC
  722.     bra     doORchk
  723.  
  724.  ; ASL abs
  725.   op0E:
  726.     move.b  1(REGMPC),-(SP)
  727.     move.w  (SP)+,REGEA
  728.     move.b  (REGMPC),REGEA
  729.     addq.w  #2,REGMPC
  730.     bra     doASLchk
  731.  
  732.  ; BPL
  733.   op10:
  734.     btst    #3,REGST
  735.     bne.s   nobpl               ; BITN = 0x08 = bit #3
  736.     move.b  (REGMPC)+,DBUS
  737.     ext.w   DBUS
  738.     adda.w  DBUS,REGMPC
  739.     DISPATCH
  740.   nobpl:
  741.     addq.l  #1,REGMPC
  742.     DISPATCH
  743.  
  744.  ; ORA (zp),Y
  745.   op11:
  746.     clr.w   REGEA
  747.     move.b  (REGMPC)+,REGEA
  748.     move.l  REGEA,REGMEA
  749.     move.b  1(REGMEA),-(SP)
  750.     move.w  (SP)+,REGEA;
  751.     move.b  (REGMEA),REGEA
  752.     add.w   REGY,REGEA
  753.     bra     doORchk
  754.  
  755.  ; ORA zp,X
  756.   op15:
  757.     clr.w   REGEA
  758.     move.b  (REGMPC)+,REGEA
  759.     add.b   REGX,REGEA
  760.     bra     doOR
  761.  
  762.  ; ASL zp,X
  763.   op16:
  764.     clr.w   REGEA
  765.     move.b  (REGMPC)+,REGEA
  766.     add.b   REGX,REGEA
  767.     bra     doASL
  768.  
  769.  ; CLC
  770.   op18:
  771.     andi.b  #~BITX,REGST
  772.     DISPATCH
  773.  
  774.  ; ORA abs,Y
  775.   op19:
  776.     move.b  1(REGMPC),-(SP)
  777.     move.w  (SP)+,REGEA;
  778.     move.b  (REGMPC),REGEA
  779.     add.w   REGY,REGEA
  780.     addq.w  #2,REGMPC
  781.     bra     doORchk
  782.  
  783.  ; ORA abs,X
  784.   op1D:
  785.     move.b  1(REGMPC),-(SP)
  786.     move.w  (SP)+,REGEA;
  787.     move.b  (REGMPC),REGEA
  788.     add.w   REGX,REGEA
  789.     addq.w  #2,REGMPC
  790.     bra     doORchk
  791.  
  792.  ; ASL abs,X
  793.   op1E:
  794.     move.b  1(REGMPC),-(SP)
  795.     move.w  (SP)+,REGEA
  796.     move.b  (REGMPC),REGEA
  797.     add.w   REGX,REGEA
  798.     addq.w  #2,REGMPC
  799.     bra     doASLchk
  800.  
  801.  ; JSR abs
  802.   op20:
  803.     subq.b  #2,REGSP
  804.     move.w  REGSP,REGEA
  805.     move.l  REGEA,REGMEA
  806.     move.w  REGMPC,REGPC
  807.     addq.w  #1,REGPC
  808.     move.b  REGPC,1(REGMEA)     ; push PClo
  809.     move.w  REGPC,-(SP)
  810.     move.b  (SP)+,2(REGMEA)     ; push PChi
  811.     move.b  1(REGMPC),-(SP)
  812.     move.w  (SP)+,REGPC
  813.     move.b  (REGMPC),REGPC
  814.     move.l  REGPC,REGMPC
  815.     DISPATCH
  816.  
  817.  ; AND (zp,X)
  818.   op21:
  819.     clr.w   REGEA
  820.     move.b  (REGMPC)+,REGEA
  821.     add.b   REGX,REGEA
  822.     move.l  REGEA,REGMEA
  823.     move.b  1(REGMEA),-(SP)
  824.     move.w  (SP)+,REGEA
  825.     move.b  (REGMEA),REGEA
  826.     bra     doANDchk
  827.  
  828.  ; BIT zp
  829.   op24:
  830.     clr.w   REGEA
  831.     move.b  (REGMPC)+,REGEA
  832.     move.l  REGEA,REGMEA
  833.     bra     doBIT
  834.  
  835.  ; AND zp
  836.   op25:
  837.     clr.w   REGEA
  838.     move.b  (REGMPC)+,REGEA
  839.     bra     doAND
  840.  
  841.  ; ROL zp
  842.   op26:
  843.     clr.w   REGEA
  844.     move.b  (REGMPC)+,REGEA
  845.     bra     doROL
  846.  
  847.  ; PLP
  848.   op28:
  849.     addq.b  #1,REGSP
  850.     move.w  REGSP,REGEA
  851.     move.l  REGEA,REGMEA
  852.     move.b  (REGMEA),REGST
  853.     movem.l DBUS/REGA/REGX/REGY/REGEA,-(SP)
  854.     move.b  REGST,DBUS
  855.     move.b  REGST,REGA
  856.     move.b  REGST,REGX
  857.     move.b  REGST,REGY
  858.     move.b  REGST,REGEA
  859.     asl.b   #3,DBUS
  860.     and.b   #0xE0,DBUS
  861.     asl.b   #4,REGEA
  862.     and.b   #BITX,REGEA
  863.     asl.b   #1,REGY
  864.     and.b   #BITZ,REGY
  865.     asr.b   #4,REGA
  866.     and.b   #BITN,REGA
  867.     asr.b   #5,REGX
  868.     and.b   #BITV,REGX
  869.     move.b  REGEA,REGST
  870.     or.b    REGX,REGST
  871.     or.b    REGY,REGST
  872.     or.b    REGA,REGST
  873.     or.b    DBUS,REGST;
  874.     movem.l (SP)+,DBUS/REGA/REGX/REGY/REGEA
  875.     DISPATCH
  876.  
  877.  ; AND #
  878.   op29:
  879.     and.b   (REGMPC)+,REGA
  880.     move.w  SR,DBUS
  881.     and.b   #(BITN|BITZ),DBUS
  882.     and.b   #~(BITN|BITZ),REGST
  883.     or.b    DBUS,REGST
  884.     DISPATCH
  885.  
  886.  ; ROL A
  887.   op2A:
  888.     move.b  REGST,CCR                   ; prepare X bit
  889.     ROXL.b  #1,REGA
  890.     move.w  SR,DBUS
  891.     and.b   #(BITN|BITZ|BITX),DBUS
  892.     and.b   #~(BITN|BITZ|BITX),REGST
  893.     or.b    DBUS,REGST
  894.     DISPATCH
  895.  
  896.  ; BIT abs
  897.   op2C:
  898.     move.b  1(REGMPC),-(SP)
  899.     move.w  (SP)+,REGEA
  900.     move.b  (REGMPC),REGEA
  901.     addq.w  #2,REGMPC
  902.     bra     doBITchk
  903.  
  904.  ; AND abs
  905.   op2D:
  906.     move.b  1(REGMPC),-(SP)
  907.     move.w  (SP)+,REGEA
  908.     move.b  (REGMPC),REGEA
  909.     addq.w  #2,REGMPC
  910.     bra     doANDchk
  911.  
  912.  ; ROL abs
  913.   op2E:
  914.     move.b  1(REGMPC),-(SP)
  915.     move.w  (SP)+,REGEA
  916.     move.b  (REGMPC),REGEA
  917.     addq.w  #2,REGMPC
  918.     bra     doROLchk
  919.  
  920.  ; BMI
  921.   op30:
  922.     btst    #3,REGST
  923.     beq.s   nobmi               ; BITN = 0x08 = bit #3
  924.     move.b  (REGMPC)+,DBUS
  925.     ext.w   DBUS
  926.     adda.w  DBUS,REGMPC
  927.     DISPATCH
  928.   nobmi:
  929.     addq.l  #1,REGMPC
  930.     DISPATCH
  931.  
  932.  ; AND (zp),Y
  933.   op31:
  934.     clr.w   REGEA
  935.     move.b  (REGMPC)+,REGEA
  936.     move.l  REGEA,REGMEA
  937.     move.b  1(REGMEA),-(SP)
  938.     move.w  (SP)+,REGEA
  939.     move.b  (REGMEA),REGEA
  940.     add.w   REGY,REGEA
  941.     bra     doANDchk
  942.  
  943.  ; AND zp,X
  944.   op35:
  945.     clr.w   REGEA
  946.     move.b  (REGMPC)+,REGEA
  947.     add.b   REGX,REGEA
  948.     bra     doAND
  949.  
  950.  ; ROL zp,X
  951.   op36:
  952.     clr.w   REGEA
  953.     move.b  (REGMPC)+,REGEA
  954.     add.b   REGX,REGEA
  955.     bra     doROL
  956.  
  957.  ; SEC
  958.   op38:
  959.     ori.b   #BITX,REGST
  960.     DISPATCH
  961.  
  962.  ; AND abs,Y
  963.   op39:
  964.     move.b  1(REGMPC),-(SP)
  965.     move.w  (SP)+,REGEA
  966.     move.b  (REGMPC),REGEA
  967.     add.w   REGY,REGEA
  968.     addq.w  #2,REGMPC
  969.     bra     doANDchk
  970.  
  971.  ; AND abs,X
  972.   op3D:
  973.     move.b  1(REGMPC),-(SP)
  974.     move.w  (SP)+,REGEA
  975.     move.b  (REGMPC),REGEA
  976.     add.w   REGX,REGEA
  977.     addq.w  #2,REGMPC
  978.     bra     doANDchk
  979.  
  980.  ; ROL abs,X
  981.   op3E:
  982.     move.b  1(REGMPC),-(SP)
  983.     move.w  (SP)+,REGEA
  984.     move.b  (REGMPC),REGEA
  985.     add.w   REGX,REGEA
  986.     addq.w  #2,REGMPC
  987.     bra     doROLchk
  988.  
  989.  ; RTI
  990.  ; should never execute since the emulator doesn't really support interrupts
  991.  ; But, deferred VBIs end in an RTI, so it is included here
  992.   op40:
  993.     move.w  REGSP,REGEA
  994.     move.l  REGEA,REGMEA
  995.     move.b  2(REGMEA),-(SP)     ; pull PChi
  996.     move.w  (SP)+,REGPC
  997.     move.b  1(REGMEA),REGPC     ; pull PClo
  998.     move.l  REGPC,REGMPC        ; do NOT increment PC for an RTI
  999.     move.b  3(REGMEA),REGST     ; pull processor, don't bother decoding
  1000.     addq.b  #3,REGSP
  1001.     DISPATCH
  1002.  
  1003.  ; EOR (zp,X)
  1004.   op41:
  1005.     clr.w   REGEA
  1006.     move.b  (REGMPC)+,REGEA
  1007.     add.b   REGX,REGEA
  1008.     move.l  REGEA,REGMEA
  1009.     move.b  1(REGMEA),-(SP)
  1010.     move.w  (SP)+,REGEA
  1011.     move.b  (REGMEA),REGEA
  1012.     bra     doEORchk
  1013.  
  1014.  ; EOR zp
  1015.   op45:
  1016.     clr.w   REGEA
  1017.     move.b  (REGMPC)+,REGEA
  1018.     bra     doEOR
  1019.  
  1020.  ; LSR zp
  1021.   op46:
  1022.     clr.w   REGEA
  1023.     move.b  (REGMPC)+,REGEA
  1024.     bra     doLSR
  1025.  
  1026.  ; PHA
  1027.   op48:
  1028.     move.w  REGSP,REGEA
  1029.     move.l  REGEA,REGMEA
  1030.     move.b  REGA,(REGMEA)       ; push acc
  1031.     subq.b  #1,REGSP
  1032.     DISPATCH
  1033.  
  1034.  ; EOR #
  1035.   op49:
  1036.     move.b  (REGMPC)+,DBUS
  1037.     eor.b   DBUS,REGA
  1038.     move.w  SR,DBUS
  1039.     and.b   #(BITN|BITZ),DBUS
  1040.     and.b   #~(BITN|BITZ),REGST
  1041.     or.b    DBUS,REGST
  1042.     DISPATCH
  1043.  
  1044.  ; LSR A
  1045.   op4A:
  1046.     lsr.b   #1,REGA
  1047.     move.w  SR,DBUS
  1048.     and.b   #(BITN|BITZ|BITX),DBUS
  1049.     and.b   #~(BITN|BITZ|BITX),REGST
  1050.     or.b    DBUS,REGST
  1051.     DISPATCH
  1052.  
  1053.  ; JMP abs
  1054.   op4C:
  1055.     move.b  1(REGMPC),-(SP)
  1056.     move.w  (SP)+,REGPC
  1057.     move.b  (REGMPC),REGPC
  1058.     move.l  REGPC,REGMPC
  1059.     DISPATCH
  1060.  
  1061.  ; EOR abs
  1062.   op4D:
  1063.     move.b  1(REGMPC),-(SP)
  1064.     move.w  (SP)+,REGEA
  1065.     move.b  (REGMPC),REGEA
  1066.     addq.w  #2,REGMPC
  1067.     bra     doEORchk
  1068.  
  1069.  ; LSR abs
  1070.   op4E:
  1071.     move.b  1(REGMPC),-(SP)
  1072.     move.w  (SP)+,REGEA
  1073.     move.b  (REGMPC),REGEA
  1074.     addq.w  #2,REGMPC
  1075.     bra     doLSRchk
  1076.  
  1077.  ; BVC
  1078.   op50:
  1079.     btst    #1,REGST
  1080.     bne.s   nobvc               ; BITV = 0x02 = bit #1
  1081.     move.b  (REGMPC)+,DBUS
  1082.     ext.w   DBUS
  1083.     adda.w  DBUS,REGMPC
  1084.     DISPATCH
  1085.   nobvc:
  1086.     addq.l  #1,REGMPC
  1087.     DISPATCH
  1088.  
  1089.  ; EOR (zp),Y
  1090.   op51:
  1091.     clr.w   REGEA
  1092.     move.b  (REGMPC)+,REGEA
  1093.     move.l  REGEA,REGMEA
  1094.     move.b  1(REGMEA),-(SP)
  1095.     move.w  (SP)+,REGEA
  1096.     move.b  (REGMEA),REGEA
  1097.     add.w   REGY,REGEA
  1098.     bra     doEORchk
  1099.  
  1100.  ; EOR zp,X
  1101.   op55:
  1102.     clr.w   REGEA
  1103.     move.b  (REGMPC)+,REGEA
  1104.     add.b   REGX,REGEA
  1105.     bra     doEOR
  1106.  
  1107.  ; LSR zp,X
  1108.   op56:
  1109.     clr.w   REGEA
  1110.     move.b  (REGMPC)+,REGEA
  1111.     add.b   REGX,REGEA
  1112.     bra     doLSR
  1113.  
  1114.  ; CLI
  1115.   op58:
  1116.     andi.b  #~BITI,REGST
  1117.     DISPATCH
  1118.  
  1119.  ; EOR abs,Y
  1120.   op59:
  1121.     move.b  1(REGMPC),-(SP)
  1122.     move.w  (SP)+,REGEA
  1123.     move.b  (REGMPC),REGEA
  1124.     add.w   REGY,REGEA
  1125.     addq.w  #2,REGMPC
  1126.     bra     doEORchk
  1127.  
  1128.  ; EOR abs,X
  1129.   op5D:
  1130.     move.b  1(REGMPC),-(SP)
  1131.     move.w  (SP)+,REGEA
  1132.     move.b  (REGMPC),REGEA
  1133.     add.w   REGX,REGEA
  1134.     addq.w  #2,REGMPC
  1135.     bra     doEORchk
  1136.  
  1137.  ; LSR abs,X
  1138.   op5E:
  1139.     move.b  1(REGMPC),-(SP)
  1140.     move.w  (SP)+,REGEA
  1141.     move.b  (REGMPC),REGEA
  1142.     add.w   REGX,REGEA
  1143.     addq.w  #2,REGMPC
  1144.     bra     doLSRchk
  1145.  
  1146.  ; RTS
  1147.   op60:
  1148.     move.w  REGSP,REGEA
  1149.     move.l  REGEA,REGMEA
  1150.     move.b  2(REGMEA),-(SP)     ; pull PChi
  1151.     move.w  (SP)+,REGPC
  1152.     move.b  1(REGMEA),REGPC     ; pull PClo
  1153.     addq.b  #2,REGSP
  1154.     addq.w  #1,REGPC
  1155.     move.l  REGPC,REGMPC
  1156.     DISPATCH
  1157.  
  1158.  ; ADC (zp,X)
  1159.   op61:
  1160.     clr.w   REGEA
  1161.     move.b  (REGMPC)+,REGEA
  1162.     add.b   REGX,REGEA
  1163.     move.l  REGEA,REGMEA
  1164.     move.b  1(REGMEA),-(SP)
  1165.     move.w  (SP)+,REGEA
  1166.     move.b  (REGMEA),REGEA
  1167.     bra     doADCchk
  1168.  
  1169.  ; ADC (zp,X)
  1170.   op61dec:
  1171.     clr.w   REGEA
  1172.     move.b  (REGMPC)+,REGEA
  1173.     add.b   REGX,REGEA
  1174.     bra     doADCdecchk
  1175.  
  1176.  ; ADC zp
  1177.   op65:
  1178.     clr.w   REGEA
  1179.     move.b  (REGMPC)+,REGEA
  1180.     bra     doADC
  1181.  
  1182.  ; ADC zp
  1183.   op65dec:
  1184.     clr.w   REGEA
  1185.     move.b  (REGMPC)+,REGEA
  1186.     bra     doADCdec
  1187.  
  1188.  ; ROR zp
  1189.   op66:
  1190.     clr.w   REGEA
  1191.     move.b  (REGMPC)+,REGEA
  1192.     bra     doROR
  1193.  
  1194.  ; PLA
  1195.   op68:
  1196.     addq.b  #1,REGSP
  1197.     move.w  REGSP,REGEA
  1198.     move.l  REGEA,REGMEA
  1199.     move.b  (REGMEA),REGA
  1200.     move.w  SR,DBUS
  1201.     and.b   #(BITN|BITZ),DBUS
  1202.     and.b   #~(BITN|BITZ),REGST
  1203.     or.b    DBUS,REGST
  1204.     DISPATCH
  1205.  
  1206.  ; ADC #
  1207.   op69:
  1208.     move.b  (REGMPC)+,DBUS
  1209.     ori.b   #BITZ,REGST
  1210.     move.b  REGST,CCR
  1211.     addX.b  DBUS,REGA
  1212.     move.w  SR,DBUS
  1213.     and.b   #(BITN|BITZ|BITV|BITX),DBUS
  1214.     and.b   #~(BITN|BITZ|BITV|BITX),REGST
  1215.     or.b    DBUS,REGST
  1216.     DISPATCH
  1217.  
  1218.  ; ADC #
  1219.   op69dec:
  1220.     move.b  (REGMPC)+,DBUS
  1221.     ori.b   #BITZ,REGST
  1222.     move.b  REGST,CCR
  1223.     ABCD    DBUS,REGA           ; decimal add
  1224.     move.w  SR,DBUS
  1225.     and.b   #(BITN|BITZ|BITV|BITX),DBUS
  1226.     and.b   #~(BITN|BITZ|BITV|BITX),REGST
  1227.     or.b    DBUS,REGST
  1228.     DISPATCH
  1229.  
  1230.  ; ROR A
  1231.   op6A:
  1232.     move.b  REGST,CCR           ; prepare carry bit
  1233.     ROXR.b  #1,REGA
  1234.     move.w  SR,DBUS
  1235.     and.b   #(BITN|BITZ|BITX),DBUS
  1236.     and.b   #~(BITN|BITZ|BITX),REGST
  1237.     or.b    DBUS,REGST
  1238.     DISPATCH
  1239.  
  1240.  ; JMP (abs)
  1241.   op6C:
  1242.     move.b  1(REGMPC),-(SP)
  1243.     move.w  (SP)+,REGPC
  1244.     move.b  (REGMPC),REGPC
  1245.     move.w  REGPC,REGEA         ; get vector
  1246.     move.l  REGEA,REGMEA
  1247.     move.b  1(REGMEA),-(SP)
  1248.     move.w  (SP)+,REGPC
  1249.     move.b  (REGMEA),REGPC
  1250.     move.l  REGPC,REGMPC
  1251.     DISPATCH
  1252.  
  1253.  ; ADC abs
  1254.   op6D:
  1255.     move.b  1(REGMPC),-(SP)
  1256.     move.w  (SP)+,REGEA
  1257.     move.b  (REGMPC),REGEA
  1258.     addq.w  #2,REGMPC
  1259.     bra     doADCchk
  1260.  
  1261.  ; ADC abs
  1262.   op6Ddec:
  1263.     move.b  1(REGMPC),-(SP)
  1264.     move.w  (SP)+,REGEA
  1265.     move.b  (REGMPC),REGEA
  1266.     addq.w  #2,REGMPC
  1267.     bra     doADCdecchk
  1268.  
  1269.  ; ROR abs
  1270.   op6E:
  1271.     move.b  1(REGMPC),-(SP)
  1272.     move.w  (SP)+,REGEA
  1273.     move.b  (REGMPC),REGEA
  1274.     addq.w  #2,REGMPC
  1275.     bra     doRORchk
  1276.  
  1277.  ; BVS
  1278.   op70:
  1279.     btst    #1,REGST
  1280.     beq.s   nobvs               ; BITV = 0x02 = bit #1
  1281.     move.b  (REGMPC)+,DBUS
  1282.     ext.w   DBUS
  1283.     adda.w  DBUS,REGMPC
  1284.     DISPATCH
  1285.   nobvs:
  1286.     addq.l  #1,REGMPC
  1287.     DISPATCH
  1288.  
  1289.  ; ADC (zp),Y
  1290.   op71:
  1291.     clr.w   REGEA
  1292.     move.b  (REGMPC)+,REGEA
  1293.     move.l  REGEA,REGMEA
  1294.     move.b  1(REGMEA),-(SP)
  1295.     move.w  (SP)+,REGEA
  1296.     move.b  (REGMEA),REGEA
  1297.     add.w   REGY,REGEA
  1298.     bra     doADCchk
  1299.  
  1300.  ; ADC (zp),Y
  1301.   op71dec:
  1302.     clr.w   REGEA
  1303.     move.b  (REGMPC)+,REGEA
  1304.     move.l  REGEA,REGMEA
  1305.     move.b  1(REGMEA),-(SP)
  1306.     move.w  (SP)+,REGEA
  1307.     move.b  (REGMEA),REGEA
  1308.     add.w   REGY,REGEA
  1309.     bra     doADCdecchk
  1310.  
  1311.  ; ADC zp,X
  1312.   op75:
  1313.     clr.w   REGEA
  1314.     move.b  (REGMPC)+,REGEA
  1315.     add.b   REGX,REGEA
  1316.     bra     doADC
  1317.  
  1318.  ; ADC zp,X
  1319.   op75dec:
  1320.     clr.w   REGEA
  1321.     move.b  (REGMPC)+,REGEA
  1322.     add.b   REGX,REGEA
  1323.     bra     doADCdec
  1324.  
  1325.  ; ROR zp,X
  1326.   op76:
  1327.     clr.w   REGEA
  1328.     move.b  (REGMPC)+,REGEA
  1329.     add.b   REGX,REGEA
  1330.     bra     doROR
  1331.  
  1332.  ; SEI
  1333.   op78: ori.b   #BITI,REGST
  1334.     DISPATCH
  1335.  
  1336.  ; ADC abs,Y
  1337.   op79:
  1338.     move.b  1(REGMPC),-(SP)
  1339.     move.w  (SP)+,REGEA
  1340.     move.b  (REGMPC),REGEA
  1341.     add.w   REGY,REGEA
  1342.     addq.w  #2,REGMPC
  1343.     bra     doADCchk
  1344.  
  1345.  ; ADC abs,Y
  1346.   op79dec:
  1347.     move.b  1(REGMPC),-(SP)
  1348.     move.w  (SP)+,REGEA
  1349.     move.b  (REGMPC),REGEA
  1350.     add.w   REGY,REGEA
  1351.     addq.w  #2,REGMPC
  1352.     bra     doADCdecchk
  1353.  
  1354.  ; ADC abs,X
  1355.   op7D:
  1356.     move.b  1(REGMPC),-(SP)
  1357.     move.w  (SP)+,REGEA
  1358.     move.b  (REGMPC),REGEA
  1359.     add.w   REGX,REGEA
  1360.     addq.w  #2,REGMPC
  1361.     bra     doADCchk
  1362.  
  1363.  ; ADC abs,X
  1364.   op7Ddec:
  1365.     move.b  1(REGMPC),-(SP)
  1366.     move.w  (SP)+,REGEA
  1367.     move.b  (REGMPC),REGEA
  1368.     add.w   REGX,REGEA
  1369.     addq.w  #2,REGMPC
  1370.     bra     doADCdecchk
  1371.  
  1372.  ; ROR abs,X
  1373.   op7E:
  1374.     move.b  1(REGMPC),-(SP)
  1375.     move.w  (SP)+,REGEA
  1376.     move.b  (REGMPC),REGEA
  1377.     add.w   REGX,REGEA
  1378.     addq.w  #2,REGMPC
  1379.     bra     doRORchk
  1380.  
  1381.  ; STA (zp,X)
  1382.   op81:
  1383.     clr.w   REGEA
  1384.     move.b  (REGMPC)+,REGEA
  1385.     add.b   REGX,REGEA
  1386.     move.l  REGEA,REGMEA
  1387.     move.b  1(REGMEA),-(SP)
  1388.     move.w  (SP)+,REGEA
  1389.     move.b  (REGMEA),REGEA
  1390.     bra     doSTAchk
  1391.  
  1392.  ; STY zp
  1393.   op84:
  1394.     clr.w   REGEA
  1395.     move.b  (REGMPC)+,REGEA
  1396.     move.l  REGEA,REGMEA
  1397.     move.b  REGY,(REGMEA)
  1398.     DISPATCH
  1399.  
  1400.  ; STA zp
  1401.   op85:
  1402.     clr.w   REGEA
  1403.     move.b  (REGMPC)+,REGEA
  1404.     move.l  REGEA,REGMEA
  1405.     move.b  REGA,(REGMEA)
  1406.     DISPATCH
  1407.  
  1408.  ; STX zp
  1409.   op86:
  1410.     clr.w   REGEA
  1411.     move.b  (REGMPC)+,REGEA
  1412.     move.l  REGEA,REGMEA
  1413.     move.b  REGX,(REGMEA)
  1414.     DISPATCH
  1415.  
  1416.  ; DEY
  1417.   op88:
  1418.     subq.b  #1,REGY
  1419.     move.w  SR,DBUS
  1420.     and.b   #(BITN|BITZ),DBUS
  1421.     and.b   #~(BITN|BITZ),REGST
  1422.     or.b    DBUS,REGST
  1423.     DISPATCH
  1424.  
  1425.  ; TXA
  1426.   op8A:
  1427.     move.b  REGX,REGA
  1428.     move.w  SR,DBUS
  1429.     and.b   #(BITN|BITZ),DBUS
  1430.     and.b   #~(BITN|BITZ),REGST
  1431.     or.b    DBUS,REGST
  1432.     DISPATCH
  1433.  
  1434.  ; STY abs
  1435.   op8C:
  1436.     move.b  1(REGMPC),-(SP)
  1437.     move.w  (SP)+,REGEA
  1438.     move.b  (REGMPC),REGEA
  1439.     addq.w  #2,REGMPC
  1440.     bra     doSTYchk
  1441.  
  1442.  ; STA abs
  1443.   op8D:
  1444.     move.b  1(REGMPC),-(SP)
  1445.     move.w  (SP)+,REGEA
  1446.     move.b  (REGMPC),REGEA
  1447.     addq.w  #2,REGMPC
  1448.     bra     doSTAchk
  1449.  
  1450.  ; STX abs
  1451.   op8E:
  1452.     move.b  1(REGMPC),-(SP)
  1453.     move.w  (SP)+,REGEA
  1454.     move.b  (REGMPC),REGEA
  1455.     addq.w  #2,REGMPC
  1456.     bra     doSTXchk
  1457.  
  1458.  ; BCC
  1459.   op90:
  1460.     btst    #4,REGST
  1461.     bne.s   nobcc               ; BITX = 0x10 = bit #4
  1462.     move.b  (REGMPC)+,DBUS
  1463.     ext.w   DBUS
  1464.     adda.w  DBUS,REGMPC
  1465.     DISPATCH
  1466.   nobcc:
  1467.     addq.l  #1,REGMPC
  1468.     DISPATCH
  1469.  
  1470.  ; STA (zp),Y
  1471.   op91:
  1472.     clr.w   REGEA
  1473.     move.b  (REGMPC)+,REGEA
  1474.     move.l  REGEA,REGMEA
  1475.     move.b  1(REGMEA),-(SP)
  1476.     move.w  (SP)+,REGEA
  1477.     move.b  (REGMEA),REGEA
  1478.     add.w   REGY,REGEA
  1479.     bra     doSTAchk
  1480.  
  1481.  ; STY zp,X
  1482.   op94:
  1483.     clr.w   REGEA
  1484.     move.b  (REGMPC)+,REGEA
  1485.     add.b   REGX,REGEA
  1486.     move.l  REGEA,REGMEA
  1487.     move.b  REGY,(REGMEA)
  1488.     DISPATCH
  1489.  
  1490.  ; STA zp,X
  1491.   op95:
  1492.     clr.w   REGEA
  1493.     move.b  (REGMPC)+,REGEA
  1494.     add.b   REGX,REGEA
  1495.     move.l  REGEA,REGMEA
  1496.     move.b  REGA,(REGMEA)
  1497.     DISPATCH
  1498.  
  1499.  ; STX zp,Y
  1500.   op96:
  1501.     clr.w   REGEA
  1502.     move.b  (REGMPC)+,REGEA
  1503.     add.b   REGY,REGEA
  1504.     move.l  REGEA,REGMEA
  1505.     move.b  REGX,(REGMEA)
  1506.     DISPATCH
  1507.  
  1508.  ; TYA
  1509.   op98:
  1510.     move.b  REGY,REGA
  1511.     move.w  SR,DBUS
  1512.     and.b   #(BITN|BITZ),DBUS
  1513.     and.b   #~(BITN|BITZ),REGST
  1514.     or.b    DBUS,REGST
  1515.     DISPATCH
  1516.  
  1517.  ; STA abs,Y
  1518.   op99:
  1519.     move.b  1(REGMPC),-(SP)
  1520.     move.w  (SP)+,REGEA
  1521.     move.b  (REGMPC),REGEA
  1522.     add.w   REGY,REGEA
  1523.     addq.w  #2,REGMPC
  1524.     bra     doSTAchk
  1525.  
  1526.  ; TXS
  1527.   op9A:
  1528.     move.b  REGX,REGSP
  1529.     DISPATCH
  1530.  
  1531.  ; STA abs,X
  1532.   op9D:
  1533.     move.b  1(REGMPC),-(SP)
  1534.     move.w  (SP)+,REGEA
  1535.     move.b  (REGMPC),REGEA
  1536.     add.w   REGX,REGEA
  1537.     addq.w  #2,REGMPC
  1538.     bra     doSTAchk
  1539.  
  1540.  ; LDY #
  1541.   opA0:
  1542.     move.b  (REGMPC)+,REGY
  1543.     move.w  SR,DBUS
  1544.     and.b   #(BITN|BITZ),DBUS
  1545.     and.b   #~(BITN|BITZ),REGST
  1546.     or.b    DBUS,REGST
  1547.     DISPATCH
  1548.  
  1549.  ; LDA (zp,X)
  1550.   opA1:
  1551.     clr.w   REGEA
  1552.     move.b  (REGMPC)+,REGEA
  1553.     add.b   REGX,REGEA
  1554.     move.l  REGEA,REGMEA
  1555.     move.b  1(REGMEA),-(SP)
  1556.     move.w  (SP)+,REGEA
  1557.     move.b  (REGMEA),REGEA
  1558.     bra     doLDAchk
  1559.  
  1560.  ; LDX #
  1561.   opA2:
  1562.     move.b  (REGMPC)+,REGX
  1563.     move.w  SR,DBUS
  1564.     and.b   #(BITN|BITZ),DBUS
  1565.     and.b   #~(BITN|BITZ),REGST
  1566.     or.b    DBUS,REGST
  1567.     DISPATCH
  1568.  
  1569.  ; LDY zp
  1570.   opA4:
  1571.     clr.w   REGEA
  1572.     move.b  (REGMPC)+,REGEA
  1573.     move.l  REGEA,REGMEA
  1574.     move.b  (REGMEA),REGY
  1575.     move.w  SR,DBUS
  1576.     and.b   #(BITN|BITZ),DBUS
  1577.     and.b   #~(BITN|BITZ),REGST
  1578.     or.b    DBUS,REGST
  1579.     DISPATCH
  1580.  
  1581.  ; LDA zp
  1582.   opA5:
  1583.     clr.w   REGEA
  1584.     move.b  (REGMPC)+,REGEA
  1585.     move.l  REGEA,REGMEA
  1586.     move.b  (REGMEA),REGA
  1587.     move.w  SR,DBUS
  1588.     and.b   #(BITN|BITZ),DBUS
  1589.     and.b   #~(BITN|BITZ),REGST
  1590.     or.b    DBUS,REGST
  1591.     DISPATCH
  1592.  
  1593.  ; LDX zp
  1594.   opA6:
  1595.     clr.w   REGEA
  1596.     move.b  (REGMPC)+,REGEA
  1597.     move.l  REGEA,REGMEA
  1598.     move.b  (REGMEA),REGX
  1599.     move.w  SR,DBUS
  1600.     and.b   #(BITN|BITZ),DBUS
  1601.     and.b   #~(BITN|BITZ),REGST
  1602.     or.b    DBUS,REGST
  1603.     DISPATCH
  1604.  
  1605.  ; TAY
  1606.   opA8:
  1607.     move.b  REGA,REGY
  1608.     move.w  SR,DBUS
  1609.     and.b   #(BITN|BITZ),DBUS
  1610.     and.b   #~(BITN|BITZ),REGST
  1611.     or.b    DBUS,REGST
  1612.     DISPATCH
  1613.  
  1614.  ; LDA #
  1615.   opA9:
  1616.     move.b  (REGMPC)+,REGA
  1617.     move.w  SR,DBUS
  1618.     and.b   #(BITN|BITZ),DBUS
  1619.     and.b   #~(BITN|BITZ),REGST
  1620.     or.b    DBUS,REGST
  1621.     DISPATCH
  1622.  
  1623.  ; TAX
  1624.   opAA:
  1625.     move.b  REGA,REGX
  1626.     move.w  SR,DBUS
  1627.     and.b   #(BITN|BITZ),DBUS
  1628.     and.b   #~(BITN|BITZ),REGST
  1629.     or.b    DBUS,REGST
  1630.     DISPATCH
  1631.  
  1632.  ; LDY abs
  1633.   opAC:
  1634.     move.b  1(REGMPC),-(SP)
  1635.     move.w  (SP)+,REGEA
  1636.     move.b  (REGMPC),REGEA
  1637.     addq.w  #2,REGMPC
  1638.     bra     doLDYchk
  1639.  
  1640.  ; LDA abs
  1641.   opAD:
  1642.     move.b  1(REGMPC),-(SP)
  1643.     move.w  (SP)+,REGEA
  1644.     move.b  (REGMPC),REGEA
  1645.     addq.w  #2,REGMPC
  1646.     bra     doLDAchk
  1647.  
  1648.  ; LDX abs
  1649.   opAE:
  1650.     move.b  1(REGMPC),-(SP)
  1651.     move.w  (SP)+,REGEA
  1652.     move.b  (REGMPC),REGEA
  1653.     addq.w  #2,REGMPC
  1654.     bra     doLDXchk
  1655.  
  1656.  ; BCS
  1657.   opB0:
  1658.     btst    #4,REGST
  1659.     beq.s   nobcs               ; BITX= 0x10 = bit #4
  1660.     move.b  (REGMPC)+,DBUS
  1661.     ext.w   DBUS
  1662.     adda.w  DBUS,REGMPC
  1663.     DISPATCH
  1664.   nobcs:
  1665.     addq.l  #1,REGMPC
  1666.     DISPATCH
  1667.  
  1668.  ; LDA (zp),Y
  1669.   opB1:
  1670.     clr.w   REGEA
  1671.     move.b  (REGMPC)+,REGEA
  1672.     move.l  REGEA,REGMEA
  1673.     move.b  1(REGMEA),-(SP)
  1674.     move.w  (SP)+,REGEA
  1675.     move.b  (REGMEA),REGEA
  1676.     add.w   REGY,REGEA
  1677.     bra     doLDAchk
  1678.  
  1679.  ; LDY zp,X
  1680.   opB4:
  1681.     clr.w   REGEA
  1682.     move.b  (REGMPC)+,REGEA
  1683.     add.b   REGX,REGEA
  1684.     bra     doLDY
  1685.  
  1686.  ; LDA zp,X
  1687.   opB5:
  1688.     clr.w   REGEA
  1689.     move.b  (REGMPC)+,REGEA
  1690.     add.b   REGX,REGEA
  1691.     bra     doLDA
  1692.  
  1693.  ; LDX zp,Y
  1694.   opB6:
  1695.     clr.w   REGEA
  1696.     move.b  (REGMPC)+,REGEA
  1697.     add.b   REGY,REGEA
  1698.     bra     doLDX
  1699.  
  1700.  ; CLV
  1701.   opB8: andi.b  #~BITV,REGST
  1702.     DISPATCH
  1703.  
  1704.  ; LDA abs,Y
  1705.   opB9:
  1706.     move.b  1(REGMPC),-(SP)
  1707.     move.w  (SP)+,REGEA
  1708.     move.b  (REGMPC),REGEA
  1709.     add.w   REGY,REGEA
  1710.     addq.w  #2,REGMPC
  1711.     bra     doLDAchk
  1712.  
  1713.  ; TAX
  1714.   opBA:
  1715.     move.b  REGSP,REGX
  1716.     move.w  SR,DBUS
  1717.     and.b   #(BITN|BITZ),DBUS
  1718.     and.b   #~(BITN|BITZ),REGST
  1719.     or.b    DBUS,REGST
  1720.     DISPATCH
  1721.  
  1722.  ; LDY abs,X
  1723.   opBC:
  1724.     move.b  1(REGMPC),-(SP)
  1725.     move.w  (SP)+,REGEA
  1726.     move.b  (REGMPC),REGEA
  1727.     add.w   REGX,REGEA
  1728.     addq.w  #2,REGMPC
  1729.     bra     doLDYchk
  1730.  
  1731.  ; LDA abs,X
  1732.   opBD:
  1733.     move.b  1(REGMPC),-(SP)
  1734.     move.w  (SP)+,REGEA
  1735.     move.b  (REGMPC),REGEA
  1736.     add.w   REGX,REGEA
  1737.     addq.w  #2,REGMPC
  1738.     bra     doLDAchk
  1739.  
  1740.  ; LDX abs,Y
  1741.   opBE:
  1742.     move.b  1(REGMPC),-(SP)
  1743.     move.w  (SP)+,REGEA
  1744.     move.b  (REGMPC),REGEA
  1745.     add.w   REGY,REGEA
  1746.     addq.w  #2,REGMPC
  1747.     bra     doLDXchk
  1748.  
  1749.  ; CPY #
  1750.   opC0:
  1751.     move.b  (REGMPC)+,DBUS
  1752.     bra     doCPY
  1753.  
  1754.  ; CMP (zp,X)
  1755.   opC1:
  1756.     clr.w   REGEA
  1757.     move.b  (REGMPC)+,REGEA
  1758.     add.b   REGX,REGEA
  1759.     move.l  REGEA,REGMEA
  1760.     move.b  1(REGMEA),-(SP)
  1761.     move.w  (SP)+,REGEA
  1762.     move.b  (REGMEA),REGEA
  1763.     move.l  REGEA,REGMEA
  1764.     move.b  (REGMEA),DBUS
  1765.     bra     doCMP
  1766.  
  1767.  ; CPY zp
  1768.   opC4:
  1769.     clr.w   REGEA
  1770.     move.b  (REGMPC)+,REGEA
  1771.     move.l  REGEA,REGMEA
  1772.     move.b  (REGMEA),DBUS
  1773.     bra     doCPY
  1774.  
  1775.  ; CMP zp
  1776.   opC5:
  1777.     clr.w   REGEA
  1778.     move.b  (REGMPC)+,REGEA
  1779.     move.l  REGEA,REGMEA
  1780.     move.b  (REGMEA),DBUS
  1781.     bra     doCMP
  1782.  
  1783.  ; DEC zp
  1784.   opC6:
  1785.     clr.w   REGEA
  1786.     move.b  (REGMPC)+,REGEA
  1787.     bra     doDEC
  1788.  
  1789.  ; INY
  1790.   opC8: addq.b  #1,REGY
  1791.     move.w  SR,DBUS
  1792.     and.b   #(BITN|BITZ),DBUS
  1793.     and.b   #~(BITN|BITZ),REGST
  1794.     or.b    DBUS,REGST
  1795.     DISPATCH
  1796.  
  1797.  ; CMP #
  1798.   opC9:
  1799.     move.b  (REGMPC)+,DBUS
  1800.     bra     doCMP
  1801.  
  1802.  ; DEX
  1803.   opCA:
  1804.     subq.b  #1,REGX
  1805.     move.w  SR,DBUS
  1806.     and.b   #(BITN|BITZ),DBUS
  1807.     and.b   #~(BITN|BITZ),REGST
  1808.     or.b    DBUS,REGST
  1809.     DISPATCH
  1810.  
  1811.  ; CPY abs
  1812.   opCC:
  1813.     move.b  1(REGMPC),-(SP)
  1814.     move.w  (SP)+,REGEA
  1815.     move.b  (REGMPC),REGEA
  1816.     addq.w  #2,REGMPC
  1817.     move.l  REGEA,REGMEA
  1818.     move.b  (REGMEA),DBUS
  1819.     bra     doCPY
  1820.  
  1821.  ; CMP abs
  1822.   opCD:
  1823.     move.b  1(REGMPC),-(SP)
  1824.     move.w  (SP)+,REGEA
  1825.     move.b  (REGMPC),REGEA
  1826.     addq.w  #2,REGMPC
  1827.     move.l  REGEA,REGMEA
  1828.     move.b  (REGMEA),DBUS
  1829.     bra     doCMP
  1830.  
  1831.  ; DEC abs
  1832.   opCE:
  1833.     move.b  1(REGMPC),-(SP)
  1834.     move.w  (SP)+,REGEA
  1835.     move.b  (REGMPC),REGEA
  1836.     addq.w  #2,REGMPC
  1837.     bra     doDECchk
  1838.  
  1839.  ; BNE
  1840.   opD0:
  1841.     btst    #2,REGST
  1842.     bne.s   nobne               ; BITZ = 0x04 = bit #2
  1843.     move.b  (REGMPC)+,DBUS
  1844.     ext.w   DBUS
  1845.     adda.w  DBUS,REGMPC
  1846.     DISPATCH
  1847.   nobne:
  1848.     addq.l  #1,REGMPC
  1849.     DISPATCH
  1850.  
  1851.  ; CMP (zp),Y
  1852.   opD1:
  1853.     clr.w   REGEA
  1854.     move.b  (REGMPC)+,REGEA
  1855.     move.l  REGEA,REGMEA
  1856.     move.b  1(REGMEA),-(SP)
  1857.     move.w  (SP)+,REGEA
  1858.     move.b  (REGMEA),REGEA
  1859.     add.w   REGY,REGEA
  1860.     move.l  REGEA,REGMEA
  1861.     move.b  (REGMEA),DBUS
  1862.     bra     doCMP
  1863.  
  1864.  ; CMP zp,X
  1865.   opD5:
  1866.     clr.w   REGEA
  1867.     move.b  (REGMPC)+,REGEA
  1868.     add.b   REGX,REGEA
  1869.     move.l  REGEA,REGMEA
  1870.     move.b  (REGMEA),DBUS
  1871.     bra     doCMP
  1872.  
  1873.  ; DEC zp,X
  1874.   opD6:
  1875.     clr.w   REGEA
  1876.     move.b  (REGMPC)+,REGEA
  1877.     add.b   REGX,REGEA
  1878.     bra     doDEC
  1879.  
  1880.  ; CLD
  1881.   opD8:
  1882.     andi.b  #~BITD,REGST
  1883.     lea     vec_6502(GLOBAL),REGOPS     ; pointer to opcode table
  1884.     DISPATCH
  1885.  
  1886.  ; CMP abs,Y
  1887.   opD9:
  1888.     move.b  1(REGMPC),-(SP)
  1889.     move.w  (SP)+,REGEA
  1890.     move.b  (REGMPC),REGEA
  1891.     add.w   REGY,REGEA
  1892.     addq.w  #2,REGMPC
  1893.     move.l  REGEA,REGMEA
  1894.     move.b  (REGMEA),DBUS
  1895.     bra     doCMP
  1896.  
  1897.  ; CMP abs,X
  1898.   opDD:
  1899.     move.b  1(REGMPC),-(SP)
  1900.     move.w  (SP)+,REGEA
  1901.     move.b  (REGMPC),REGEA
  1902.     add.w   REGX,REGEA
  1903.     addq.w  #2,REGMPC
  1904.     move.l  REGEA,REGMEA
  1905.     move.b  (REGMEA),DBUS
  1906.     bra     doCMP
  1907.  
  1908.  ; DEC abs,X
  1909.   opDE:
  1910.     move.b  1(REGMPC),-(SP)
  1911.     move.w  (SP)+,REGEA
  1912.     move.b  (REGMPC),REGEA
  1913.     add.w   REGX,REGEA
  1914.     addq.w  #2,REGMPC
  1915.     bra     doDECchk
  1916.  
  1917.  ; CPX #
  1918.   opE0:
  1919.     move.b  (REGMPC)+,DBUS
  1920.     bra     doCPX
  1921.  
  1922.  ; SBC (zp,X)
  1923.   opE1:
  1924.     clr.w   REGEA
  1925.     move.b  (REGMPC)+,REGEA
  1926.     add.b   REGX,REGEA
  1927.     move.l  REGEA,REGMEA
  1928.     move.b  1(REGMEA),-(SP)
  1929.     move.w  (SP)+,REGEA
  1930.     move.b  (REGMEA),REGEA
  1931.     bra     doSBCchk
  1932.  
  1933.  ; SBC (zp,X)
  1934.   opE1dec:
  1935.     clr.w   REGEA
  1936.     move.b  (REGMPC)+,REGEA
  1937.     add.b   REGX,REGEA
  1938.     move.l  REGEA,REGMEA
  1939.     move.b  1(REGMEA),-(SP)
  1940.     move.w  (SP)+,REGEA
  1941.     move.b  (REGMEA),REGEA
  1942.     bra     doSBCdecchk
  1943.  
  1944.  ; CPX zp
  1945.   opE4:
  1946.     clr.w   REGEA
  1947.     move.b  (REGMPC)+,REGEA
  1948.     move.l  REGEA,REGMEA
  1949.     move.b  (REGMEA),DBUS
  1950.     bra     doCPX
  1951.  
  1952.  ; SBC zp
  1953.   opE5:
  1954.     clr.w   REGEA
  1955.     move.b  (REGMPC)+,REGEA
  1956.     bra     doSBC
  1957.  
  1958.  ; SBC zp
  1959.   opE5dec:
  1960.     clr.w   REGEA
  1961.     move.b  (REGMPC)+,REGEA
  1962.     bra     doSBCdec
  1963.  
  1964.  ; INC zp
  1965.   opE6:
  1966.     clr.w   REGEA
  1967.     move.b  (REGMPC)+,REGEA
  1968.     bra     doINC
  1969.  
  1970.  ; INX
  1971.   opE8:
  1972.     addq.b  #1,REGX
  1973.     move.w  SR,DBUS
  1974.     and.b   #(BITN|BITZ),DBUS
  1975.     and.b   #~(BITN|BITZ),REGST
  1976.     or.b    DBUS,REGST
  1977.     DISPATCH
  1978.  
  1979.  ; SBC #
  1980.   opE9:
  1981.     move.b  (REGMPC)+,DBUS
  1982.     eori.b  #BITX,REGST
  1983.     ori.b   #BITZ,REGST
  1984.     move.b  REGST,CCR
  1985.     subx.b  DBUS,REGA
  1986.     move.w  SR,DBUS
  1987.     and.b   #(BITN|BITZ|BITX|BITV),DBUS
  1988.     eori.b  #BITX,DBUS
  1989.     and.b   #~(BITN|BITZ|BITX|BITV),REGST
  1990.     or.b    DBUS,REGST
  1991.     DISPATCH
  1992.  
  1993.  ; SBC #
  1994.   opE9dec:
  1995.     move.b  (REGMPC)+,DBUS
  1996.     eori.b  #BITX,REGST
  1997.     ori.b   #BITZ,REGST
  1998.     move.b  REGST,CCR
  1999.     sbcd    DBUS,REGA
  2000.     move.w  SR,DBUS
  2001.     and.b   #(BITN|BITZ|BITX|BITV),DBUS
  2002.     eori.b  #BITX,DBUS
  2003.     and.b   #~(BITN|BITZ|BITX|BITV),REGST
  2004.     or.b    DBUS,REGST
  2005.     DISPATCH
  2006.  
  2007.  ; CPX abs
  2008.   opEC:
  2009.     move.b  1(REGMPC),-(SP)
  2010.     move.w  (SP)+,REGEA
  2011.     move.b  (REGMPC),REGEA
  2012.     addq.w  #2,REGMPC
  2013.     move.l  REGEA,REGMEA
  2014.     move.b  (REGMEA),DBUS
  2015.     bra     doCPX
  2016.  
  2017.  ; SBC abs
  2018.   opED:
  2019.     move.b  1(REGMPC),-(SP)
  2020.     move.w  (SP)+,REGEA
  2021.     move.b  (REGMPC),REGEA
  2022.     addq.w  #2,REGMPC
  2023.     bra     doSBCchk
  2024.  
  2025.  ; SBC abs
  2026.   opEDdec:
  2027.     move.b  1(REGMPC),-(SP)
  2028.     move.w  (SP)+,REGEA
  2029.     move.b  (REGMPC),REGEA
  2030.     addq.w  #2,REGMPC
  2031.     bra     doSBCdecchk
  2032.  
  2033.  ; INC abs
  2034.   opEE:
  2035.     move.b  1(REGMPC),-(SP)
  2036.     move.w  (SP)+,REGEA
  2037.     move.b  (REGMPC),REGEA
  2038.     addq.w  #2,REGMPC
  2039.     bra     doINCchk
  2040.  
  2041.  ; BEQ
  2042.   opF0:
  2043.     btst    #2,REGST
  2044.     beq.s   nobeq               ; BITZ = 0x04 = bit #2
  2045.     move.b  (REGMPC)+,DBUS
  2046.     ext.w   DBUS
  2047.     adda.w  DBUS,REGMPC
  2048.     DISPATCH
  2049.   nobeq:
  2050.     addq.l  #1,REGMPC
  2051.     DISPATCH
  2052.  
  2053.  ; SBC (zp),Y
  2054.   opF1:
  2055.     clr.w   REGEA
  2056.     move.b  (REGMPC)+,REGEA
  2057.     move.l  REGEA,REGMEA
  2058.     move.b  1(REGMEA),-(SP)
  2059.     move.w  (SP)+,REGEA
  2060.     move.b  (REGMEA),REGEA
  2061.     add.w   REGY,REGEA
  2062.     bra     doSBCchk
  2063.  
  2064.  ; SBC (zp),Y
  2065.   opF1dec:
  2066.     clr.w   REGEA
  2067.     move.b  (REGMPC)+,REGEA
  2068.     move.l  REGEA,REGMEA
  2069.     move.b  1(REGMEA),-(SP)
  2070.     move.w  (SP)+,REGEA
  2071.     move.b  (REGMEA),REGEA
  2072.     add.w   REGY,REGEA
  2073.     bra     doSBCdecchk
  2074.  
  2075.  ; SBC zp,X
  2076.   opF5:
  2077.     clr.w   REGEA
  2078.     move.b  (REGMPC)+,REGEA
  2079.     add.b   REGX,REGEA
  2080.     bra     doSBC
  2081.  
  2082.  ; SBC zp,X
  2083.   opF5dec:
  2084.     clr.w   REGEA
  2085.     move.b  (REGMPC)+,REGEA
  2086.     add.b   REGX,REGEA
  2087.     bra     doSBCdec
  2088.  
  2089.  ; INC zp,X
  2090.   opF6:
  2091.     clr.w   REGEA
  2092.     move.b  (REGMPC)+,REGEA
  2093.     add.b   REGX,REGEA
  2094.     bra     doINC
  2095.  
  2096.  ; SED
  2097.   opF8:
  2098.     ori.b   #BITD,REGST
  2099.     lea     dec_6502(GLOBAL),REGOPS     ; pointer to table of dec opcodes
  2100.     DISPATCH
  2101.  
  2102.  ; SBC abs,Y
  2103.   opF9:
  2104.     move.b  1(REGMPC),-(SP)
  2105.     move.w  (SP)+,REGEA
  2106.     move.b  (REGMPC),REGEA
  2107.     add.w   REGY,REGEA
  2108.     addq.w  #2,REGMPC
  2109.     bra     doSBCchk
  2110.  
  2111.  ; SBC abs,Y
  2112.   opF9dec:
  2113.     move.b  1(REGMPC),-(SP)
  2114.     move.w  (SP)+,REGEA
  2115.     move.b  (REGMPC),REGEA
  2116.     add.w   REGY,REGEA
  2117.     addq.w  #2,REGMPC
  2118.     bra     doSBCdecchk
  2119.  
  2120.  ; SBC abs,X
  2121.   opFD:
  2122.     move.b  1(REGMPC),-(SP)
  2123.     move.w  (SP)+,REGEA
  2124.     move.b  (REGMPC),REGEA
  2125.     add.w   REGX,REGEA
  2126.     addq.w  #2,REGMPC
  2127.     bra     doSBCchk
  2128.  
  2129.  ; SBC abs,X
  2130.   opFDdec:
  2131.     move.b  1(REGMPC),-(SP)
  2132.     move.w  (SP)+,REGEA
  2133.     move.b  (REGMPC),REGEA
  2134.     add.w   REGX,REGEA
  2135.     addq.w  #2,REGMPC
  2136.     bra     doSBCdecchk
  2137.  
  2138.  ; INC abs,X
  2139.   opFE:
  2140.     move.b  1(REGMPC),-(SP)
  2141.     move.w  (SP)+,REGEA
  2142.     move.b  (REGMPC),REGEA
  2143.     add.w   REGX,REGEA
  2144.     addq.w  #2,REGMPC
  2145.     bra     doINCchk
  2146.   }
  2147. }
  2148.  
  2149.